02 Activity生命周期

整个生命周期来说,成对出现的。onCreate和onDestroy是成对的,代表着创建与销毁;onStart和onStop表示Activity对于程序是否可见(后台);onResume和onPause表示Activity对于用户是否可见(前台)。

正常生命周期

1、初次启动Activity

onCreate -> onStart -> onResume

2、界面显示时按了返回键

onPause -> onStop -> onDestroy

3、界面显示时按了Home键

onPause -> onStop

4、Home键之后再次启动

onRestart -> onStart -> onResume

5、界面显示时按了锁屏键及解锁

锁屏:onPause -> onStop
解锁:onRestart -> onStart -> onResume

6、从A Activity启动 B Activity

A onPause -> B onCreate -> B onStart -> B onResume -> A onStop
返回:B onPause -> A onRestart -> A onStart -> A onResume -> B onStop -> B onDestroy

7、从A Activity启动 B Activity (android:theme=”@style/Base.Theme.AppCompat.Dialog”)

A onPause -> B onCreate -> B onStart -> B onResume
返回:B onPause -> A onResume -> B onStop -> B onDestroy

切换横竖屏幕

targetSdkVersion 25,没有设置android:configChanges:
1、竖屏切横屏:onConfigurationChanged() -> onPause() -> onSaveInstanceState() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()
2、横屏切竖屏:onConfigurationChanged() -> onPause() -> onSaveInstanceState() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()

本人使用的是模拟器(minSdkVersion 16 / targetSdkVersion 25)测试,无论是否设置Activity的android:configChanges,或者属性值设为orientation或orientation|keyboardHidden,无论是竖屏切横屏还是横屏切竖屏,流程都如上所述,当android:configChanges=”orientation|keyboardHidden|screenSize”时,只会调用onConfigurationChanged()。经过查资料,android:targetSdkVersion这个属性会影响横竖屏切换的生命周期。详见xiaoQLud的博客

异常生命周期

1、系统配置发生改变后,默认情况下Activity会被销毁然后重新创建,生命周期参考横竖屏切换。常用的系统配置只有local、orientation和keyboardHidden。
2、资源内存不足导致低优先级的Activity被杀死,生命周期参考横竖屏切换。
3、运行时发生了异常,程序直接崩溃。例如:

1
2
for (int i = 10; i >= 0; i++)
System.out.println(10 / i)